/**
 * @file UnidadeTiposBasicos.h
 * @author  Patrick Kabongo Cisuaka 09/53806 & Yuri Lavinas 09/0015266
 *\date Criacao: 20/janeiro/2013
 *
 *  Essa unidade contem as classes que representam os dominios chamadas Tipos basicos.
 *  As classes sao: Nome, Senha, Id, Postagem, Comentario, Data e Avaliacao.
 *
 */

#ifndef UnidadeTiposBasicosH
#define UnidadeTiposBasicosH
//---------------------------------------------------------------------------

#include <string>
#include <stdexcept>

using namespace std;

/**
     * A classe TipoBasico que agrupa todas as classes Tipos basicos. Temos a funcao Validar para
     * validar o dominio que as classes representam
     * e alem disso,em caso de falha na validacao, deve
     * ser lancado uma excecao.
     */

class TipoBasico {
       virtual void validar(string) throw (invalid_argument) = 0;  
protected:
       string valor;
public:
       virtual ~TipoBasico(){}
       TipoBasico(){}
       void setValor(const string&) throw (invalid_argument);
       string getValor() const;   
};

inline void TipoBasico::setValor(const string& valor) throw (invalid_argument) {
        validar(valor);
        this->valor = valor;
}

inline string TipoBasico::getValor() const {
       return valor;
}

/**
     * A classe Tipo basico Nome. Temos a funcao Validar para
     * validar o dominio que a classe Nome representa
     * e alem disso,em caso de falha na validacao, deve
     * ser lancado uma excecao.
     */

class Nome:public TipoBasico {
private:
        void validar(string) throw (invalid_argument);
public:
        Nome() {}     /**< A funcao para a classe Tipo basico Nome. */
        Nome(string) throw (invalid_argument); /**< A funcao validar para validar o dominio da classe Nome. */
};

/**
     * A classe Tipo basico Senha. Temos a funcao Validar para
     * validar o dominio que a classe Senha representa
     * e alem disso,em caso de falha na validacao, deve
     * ser lancado uma excecao.
     */

class Senha:public TipoBasico {
private:
        void validar(string) throw (invalid_argument);
public:
        Senha () {}   /**< A funcao para a classe Tipo Basico Senha. */
        Senha(string) throw (invalid_argument); /**< A funcao validar para validar o dominio da classe Senha. */
};

/**
     * A classe Tipo basico Identificador. Temos a funcao Validar para
     * validar o dominio que a classe Identificador representa
     * e alem disso,em caso de falha na validacao, deve
     * ser lancado uma excecao.
     */
class Id:public TipoBasico {
private:
        void validar(string) throw (invalid_argument);
public:
        Id() {}  /**< A funcao para a classe Id. */
        Id(string)throw (invalid_argument); /**< A funcao validar para validar o dominio da classe Id. */
};

/**
     * A classe Tipo basico Postagem. Temos a funcao Validar para
     * validar o dominio que a classe Postagem representa
     * e alem disso,em caso de falha na validacao, deve
     * ser lancado uma excecao.
     */

class Postagem:public TipoBasico {
private:
        void validar(string) throw (invalid_argument);
public:
        Postagem () {}   /**< A funcao para a classe Postagem. */
        Postagem(string) throw (invalid_argument); /**< A funcao validar para validar o dominio da classe Postagem. */
};

/**
     * A classe Tipo basico Comentario. Temos a funcao Validar para
     * validar o dominio que a classe Comentario representa
     * e alem disso,em caso de falha na validacao, deve
     * ser lancado uma excecao.
     */


class Comentario:public TipoBasico {
private:
        void validar(string) throw (invalid_argument);
public:
        Comentario () {} /**< A funcao para a classe Comentario. */
        Comentario(string) throw (invalid_argument); /**< A funcao validar para validar o dominio da classe Comentario. */
};

/**
     * A classe Tipo basico Data. Temos a funcao Validar para
     * validar o dominio que a classe Data representa
     * e alem disso,em caso de falha na validacao, deve
     * ser lancado uma excecao.
     */

class Data:public TipoBasico {
private:
        void validar(string) throw (invalid_argument);
public:
        Data () {}  /**< A funcao para a classe Data. */
        Data(string) throw (invalid_argument); /**< A funcao validar para validar o dominio da classe Data. */
};

/**
     * A classe Tipo basico Avaliacao. Temos a funcao Validar para
     * validar o dominio que a classe Avaliacao representa
     * e alem disso,em caso de falha na validacao, deve
     * ser lancado uma excecao.
     */
class Avaliacao:public TipoBasico {
private:
        void validar(string) throw (invalid_argument);
public:
        Avaliacao () {} /**< A funcao para a classe Avaliacao. */
        Avaliacao(string) throw (invalid_argument); /**< A funcao validar para validar o dominio da classe Avaliacao. */
};
#endif
